package uu.game.majiang.core.rule.paixing;

import uu.game.majiang.core.Pai.Hupai;
import uu.game.majiang.core.rule.paixing.gb.GbPaixing;

/**
 * 和牌的牌型
 * 
 * @author uu
 * @see GbPaixing
 * @version 2010-4-29 上午11:42:30
 */
public interface Paixing {
    
    /**
     * 牌型名称
     * 
     * @return 牌型名称
     */
    String getName();
    
    /**
     * 牌型对应番数
     * 
     * @return 番数
     */
    int getFanshu();
    
    /**
     * 满足本牌型时，还可能满足的牌型。<br/>
     * 
     * 当本牌型存在时，规则规定有些牌型是不计算在内的。如九莲宝灯不计清一色，一色双龙会不计平和、七对、清一色。
     * 另外，从逻辑上讲，一些牌型存在时，其他某些牌型是不可能同时存在的，如大四喜、大三元不可能共存， 所以可以把必须判断的牌型预先记下来，减少判断次数。
     * 
     * @return 还需要判断的牌型
     */
    Paixing[] next();
    
    /**
     * 判断一副牌是否符合此牌型
     * 
     * <pre>
     * 如果符合，返回几倍，否则返回0
     * 
     * 大部分情况下返回1，但有的牌型可能存在多个，如花牌、杠牌等。
     * 
     * 判断前需要保证已经满足基本和牌即33332的形式(特殊牌型不满足，此方法内需要从头判断)。
     * 非特殊牌型如果不符合基本和牌，将得到无法预期的结果。
     * </pre>
     * 
     * @param hupai
     *            已判断能够和牌后，和牌的数据
     * @return 是否符合，如果符合，返回几倍，否则返回0
     */
    int match(Hupai hupai);
    
    /**
     * 是否特殊牌型<br/>
     * <br/>
     * 即不符合33332形式的牌型，如十三幺、七对、不靠<br/>
     * 
     * @return 是否特殊牌型
     */
    boolean isSpecial();
}
